// Kony

#pragma once

#include "CoreMinimal.h"
#include "Abilities/GameplayAbility.h"
#include "BaseGameplayAbility.generated.h"

/**
 * 游戏能力组件 基础类
============================
Ability Tags 注释说明
============================

【能力标签（Ability Tags）】
- 此能力具备一系列特定的标签（用于分类、识别、查询等）。

【取消具有标签的能力（Cancel Abilities with Tag）】
- 当执行此能力时，任何具有指定标签的能力都将被取消。

【阻止具有标签的能力（Block Abilities with Tag）】
- 在此能力生效期间，任何具有指定标签的能力都将被阻止使用。

【激活拥有标签（Activation Owned Tags）】
- 在此能力生效时，指定的标签将被应用于能力的所有者。
- 若启用了复制功能，这些标签将被复制。

【激活所需标签（Activation Required Tags）】
- 只有当能力的执行者或组件具备所有指定的标签时，此能力才能被激活。

【激活阻止标签（Activation Blocked Tags）】
- 若能力的执行者或组件具备任何指定的标签，则此能力将被阻止激活。

【源所需标签（Source Required Tags）】
- 只有当源执行者或组件具备所有指定的标签时，此能力才能被激活。

【源阻止标签（Source Blocked Tags）】
- 若源执行者或组件具备任何指定的标签，则此能力将被阻止激活。

【目标所需标签（Target Required Tags）】
- 只有当目标执行者或组件具备所有指定的标签时，此能力才能被激活。

【目标阻止标签（Target Blocked Tags）】
- 若目标执行者或组件具备任何指定的标签，则此能力将被阻止激活。
 */
UCLASS()
class GASC_HUANLING_API UBaseGameplayAbility : public UGameplayAbility
{
	  GENERATED_BODY()
public:
    //如果是游戏启动时就触发的能力标签类型 就用这个标签变量
    UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category = "Input", Meta = (Categories = "InputTag"))
    FGameplayTag StartupInputTag;
    //定义可重写 能力描述函数 用于各技能编写能力描述
    virtual FString GetDescription(int32 Level, const FText& Title, const FText& Description);
    //定义可重写 下一级能力描述函数 用于各技能下一级编写能力描述
    virtual FString GetNextLevelDescription(int32 Level, const FText& Title, const FText& Description);
    
    //获取锁定描述(用于没有符合解锁条件，被锁定的法术)
    static FString GetLockedDescription(int32 Level);
protected:
    //通用描述生成模板函数
    FString FormatAbilityDescription(int32 Level, const FText& Title, const FText& Description, const TArray<FStringFormatArg>& Args) const;
    //通用下一级描述生成模板函数
    FString FormatNextLevelDescription(int32 Level, const FText& Title, const FText& Description, const TArray<FStringFormatArg>& Args) const;
    //获取法力消耗
    float GetManaCost(float InLevel = 1.f) const;
    //获取冷却时间
    float GetCooldown(float InLevel = 1.f) const;
};


/*
Instancing Policy 实例化策略说明
============================

枚举类型：EGameplayAbilityInstancingPolicy

【1. 每个角色实例化（Instanced Per Actor）】
Instancing Policy: EGameplayAbilityInstancingPolicy::InstancedPerActor

- 描述：
  为每个角色创建一个能力实例，并在每次激活时重用。
- 特点：
  · 能够存储持久化数据（如：冷却、堆叠数等）。
  · 激活之间保持状态，但变量需要手动初始化或重置。
  · 性能适中，适合大多数具有状态的能力。

【2. 每次执行实例化（Instanced Per Execution）】
Instancing Policy: EGameplayAbilityInstancingPolicy::InstancedPerExecution

- 描述：
  每次激活能力时都会创建一个全新的实例。
- 特点：
  · 无法在多次激活间共享数据。
  · 每次激活都为干净的能力副本。
  · 性能相对较低，但适合完全隔离的执行逻辑（如一次性爆炸效果）。

【3. 非实例化（Non-Instanced）】
Instancing Policy: EGameplayAbilityInstancingPolicy::NonInstanced

- 描述：
  不创建任何实例，只使用类的默认对象（CDO）。
- 特点：
  · 无法存储任何状态。
  · 无法绑定委托或使用延时任务（如 WaitTargetData）。
  · 性能最佳，适用于无状态、快速处理的被动能力或事件触发类能力。
*/

/*
Net Execution Policy 网络执行策略说明
============================

枚举类型：EGameplayAbilityNetExecutionPolicy

【1. 本地仅执行（Local Only）】
Net Execution Policy: EGameplayAbilityNetExecutionPolicy::LocalOnly

- 描述：
  该能力只在本地客户端运行，服务器不会知晓也不会参与。
- 特点：
  · 无需网络同步，适合纯客户端特效、UI动画等。
  · 不具备任何权威性，不能用于影响游戏状态。

【2. 本地预测（Local Predicted）】
Net Execution Policy: EGameplayAbilityNetExecutionPolicy::LocalPredicted

- 描述：
  客户端先行激活并执行预测，随后服务器确认并回放正式结果。
- 特点：
  · 提升响应速度，适合有可预测性的战斗行为（如：攻击、移动技能）。
  · 若服务器结果与预测不符，会触发回滚机制。

【3. 仅服务器执行（Server Only）】
Net Execution Policy: EGameplayAbilityNetExecutionPolicy::ServerOnly

- 描述：
  仅在服务器执行，客户端不执行此能力逻辑。
- 特点：
  · 最权威安全，适合与游戏状态强相关的逻辑（如伤害计算、状态控制）。
  · 客户端只能接收最终结果（通过通知或同步状态）。

【4. 服务器发起（Server Initiated）】
Net Execution Policy: EGameplayAbilityNetExecutionPolicy::ServerInitiated

- 描述：
  由服务器先执行，然后再同步给客户端执行（需拥有权限）。
- 特点：
  · 保证顺序安全，又允许客户端展示动画或特效。
  · 适合需要同步视觉表现的中间型能力。
*/